/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MC;

import BE.Aula;
import BE.Horario;
import BE.Turno;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;
/**
 *
 * @author andre
 */
public class SelectorHorarioAula {
    //List < Aula > lAula;
    List < Horario > lHorario;
    //List < Turno > lTurnos;
    TreeMap< Integer , Integer >   aulaToSucursal;
    TreeMap< Integer , List< AulaTimeTable > >   sucursalToAulas;
    TreeMap< Integer , Turno >   idTurnoToTurno;
    HashMap< Integer , List< Integer > > hashFrecuencias;
    public SelectorHorarioAula( List< Aula >  LA , List< Horario > LH , List< Turno > LT , HashMap< Integer , List< Integer > > LF ) {
        hashFrecuencias = LF;
      //  lAula = LA;
      //  lHorario = LH;
        aulaToSucursal = new TreeMap<Integer, Integer>();
        sucursalToAulas = new TreeMap<Integer, List< AulaTimeTable > > ();
        idTurnoToTurno = new TreeMap<Integer, Turno >();
        // FIX :  se puede tener la lista de Aulas ordenada por sucursales
        // y se baja la complejidad a O( n + m*logm ) 
        // n : nro de Aulas
        // m : numero de sucursales
        for( Aula A : LA ){
            aulaToSucursal.put( A.getIdAula() , A.getSucursal().getIdSucursal() );
            List< AulaTimeTable > sucursal = sucursalToAulas.get( A.getSucursal().getIdSucursal() );
            if( sucursal == null ){
                sucursal = new ArrayList<AulaTimeTable> ();
                sucursalToAulas.put( A.getSucursal().getIdSucursal() , sucursal );
            }
            sucursal.add( new AulaTimeTable( A.getIdAula() ) );
        }
        
        for( Turno T : LT ){
            idTurnoToTurno.put( T.getIdTurno() , T );
        }
        
    }
    
    public void emparejaHorarios(){
        // FIX : se asume orden por sucursal
        int length = lHorario.size();
        int j = 0;
        for( int i = 0 ; i < length ; i++ ){
            Integer first = aulaToSucursal.get( lHorario.get( i ).getAula().getIdAula() );
            j = i;
            while( j < length ){
                Integer Sucursal = aulaToSucursal.get( lHorario.get( i ).getAula().getIdAula() );
                if( Sucursal.compareTo( first ) != 0 )  break;
            }
            emparejaHorariosSucursal( i , j , first );
            i = j ;
        }
    }
    
    public void emparejaHorariosSucursal( int inicio , int fin , Integer idSucursal ){
        
         List< AulaTimeTable > lAulaSucursal = sucursalToAulas.get( idSucursal );
         for( int i = inicio ; i <= fin ; i++ ){
             
             Turno TurnoActual = idTurnoToTurno.get( lHorario.get( i ).getTurno().getIdTurno() );
             // FIX : faltan estructuras 
             
             for( AulaTimeTable A : lAulaSucursal ){
                 if( A.getIdAula().compareTo( lHorario.get( i ).getAula().getIdAula() ) == 0 )
                     continue;
                 if( A.puedeAsignar( TurnoActual , lHorario.get(i).getFrecuencia().getIdFrecuencia(), hashFrecuencias) ){
                     A.asignaTurno( TurnoActual, lHorario.get(i).getFrecuencia().getIdFrecuencia(), hashFrecuencias);
                     lHorario.get( i ).getAula().setIdAula( A.getIdAula() );
                     break;
                 }
             }             
             
         }
    }
    
}
